package com.kotlin.flong.coroutines

import kotlinx.coroutines.*

/**
 * @Author:liangjl
 * @Date: 2020/7/7-17:52
 * @Eamil:jilongliang@sina.com
 * @Description:
 * 对于该示例，当我们在协程的finally块中使用了挂起函数时，会导致出现CancellationException异常，原因在于运行该代码块
 * 的协程已经被取消了，通常情况下，这并不会产什么问题，因为大多数关闭操作(比如说取消一个job，关闭网络连接等)通常都是非阻塞的
 * 并不需要使用挂起函数，然而，在极少数情况下，当我们在一个取消的协程运行挂起操作时，我们可以将相对应代码放置到withContext(NonCancellable){}
 * 当中，这种结构中，我们实际上使用了withContext与NonCancellable上下文
 */

fun main() = runBlocking {

    var job = launch {

        try {
            repeat(100) { i ->
                println("job :i am sleeping $i")
                delay(500)
            }
        } finally {
            withContext(NonCancellable){
                println("finally 执行了")
                delay(1000)
                println("delay 执行了")
            }

        }
    }

    delay(1300)

    println("Hello World")

    job.cancelAndJoin()

    println("Welcome")
}